import tensorflow as tf
import numpy as np

"""查看张量的维度"""

const_d_1 = tf.constant([[1, 2, 3, 4]], shape=[2, 2], dtype=tf.float32)

# 查看维度常用的方法

print(const_d_1.shape)
print(const_d_1.get_shape())
print(tf.shape(const_d_1))

"""维度的重组"""

reshape_1 = tf.constant([[1,2,3],[4,5,6]])
print(reshape_1)
tf.reshape(reshape_1,(3,2))

"""
维度的增加
tf.expand_dims(input,axis,name=None)
input:输入张量
axis:在第axis维度后加一个维度，在输入D尺寸的情况下，轴必须在[-(D+1),D]范围内，负数代表倒叙
"""

expand_sample_1 = tf.random.normal([100,100,3])
print("原始尺寸", expand_sample_1.shape)
print("在第一个维度前加一个维度", tf.expand_dims(expand_sample_1, axis=0).shape)
print("在第二个维度前加一个维度", tf.expand_dims(expand_sample_1, axis=1).shape)
print("在最后一个维度后加一个维度",tf.expand_dims(expand_sample_1, axis=-1).shape)

"""
维度的减少
tf.squeeze(input,axis=None,name=None)
input: 输入的张量
axis: axis=1 表示要删掉的为1额维度
"""
squeeze_sample_1 = tf.random.normal([1,100,100,3])
print("原始数据尺寸",squeeze_sample_1.shape)
squeeze_sample_1 = tf.squeeze(squeeze_sample_1,axis=0)
print("维度压缩后的数据尺寸",squeeze_sample_1.shape)

"""
转置
tf.transpose(a,perm=None,conjugate=False,name='transpose')

a: 输入的张量
perm: 张量的尺寸排列，一般用于高维数组的转置
conjugate: 表示负数转置
name: 名称
"""
trans_simple_1 = tf.constant([1,2,3,4,5,6],shape=[2,3])
print("原始数据尺寸：", trans_simple_1.shape)
trans_simple_1 = tf.transpose(trans_simple_1)
print("转置后数据尺寸:",trans_simple_1.shape)

"""
针对高位数据进行转置
"""
trans_simple_2 = tf.random.normal([4,100,200,3])
print("原始尺寸:", trans_simple_2.shape)
# 生成一个由4张图片，高100，宽200，3通道的图片，现在要对这四张图片进行长宽的对调，原始的perm为[0,1,2,3],现在变为[0,2,1,3]

transposed_simple_2 = tf.transpose(trans_simple_2,[0,2,1,3])
print("转置后数据尺寸:",transposed_simple_2.shape)

"""
广播
利用broadcast_to可以将小维度推广到大维度，tf.broadcast_to(input,shape,name=None)
input: 输入的张量
shape: 输出张量的尺寸
"""
broadcast_simple_1 = tf.constant([1,2,3,4,5,6])
print("原始数据",broadcast_simple_1.numpy())
broadcast_simple_1 = tf.broadcast_to(broadcast_simple_1,shape=[4,6])
print("广播后的数据：",broadcast_simple_1)

"""
运算的时候如果两个数组的形状不一样，那么tf会自动出发广播机制
"""

a = tf.constant([[0,0,0],[10,10,10],[20,20,20],[30,30,30]])
b = tf.constant([1,2,3])
print(a+b)

